package ausgabeUndDatenverwaltung;

import java.util.*;

import einlesenUndDatenverwaltung.KursListe;
import einlesenUndDatenverwaltung.Student;

/**
 * Containerklasse für Anwesenheit-Objekte je Universitaet fuer den
 * entsprechenden PruefungsTag
 * 
 * @author (Max Bogner)
 * @version (14.01.2014)
 */
public class AnwesenheitsListe {

	// Liste für alle Anwesenheitsobjekte, enthaelt Anwesenheitsobjekte
	private Vector<Anwesenheit> anwesenheitsliste = new Vector<Anwesenheit>();
	// Wird benoetigt, weil je uni und je pruefungstag eine Separate Datei ins
	// Filesystem geschrieben wird
	private String pruefungstag = "";
	private String universitaet = "";

	/**
	 * Konstruktor zum Erzeugen von Objekten der Klasse AnwesenheitListe.
	 */
	public AnwesenheitsListe() {

	}

	/**
	 * Gibt die Variable pruefungstag zurueck
	 * 
	 * @author Max Bogner
	 * @return pruefungstag: Pruefungstag
	 */
	public String getPruefungstag() {
		return pruefungstag;
	}

	/**
	 * Setzt die Variable pruefungstag
	 * 
	 * @author Max Bogner
	 * @param pruefungstag
	 *            : Variable auf die der pruefungstag gesetzt werden soll
	 */
	public void setPruefungstag(String pruefungstag) {
		this.pruefungstag = pruefungstag;
	}

	/**
	 * Gibt die Variable universitaet zurueck
	 * 
	 * @author Max Bogner
	 * @return the universitaet
	 */
	public String getUniversitaet() {
		return universitaet;
	}

	/**
	 * Setzt die Variable universitaet
	 * 
	 * @author Max Bogner
	 * @param universitaet
	 *            the universitaet to set
	 */
	public void setUniversitaet(String universitaet) {
		this.universitaet = universitaet;
	}

	/**
	 * Gibt die Variable anwesenheitsliste zurueck
	 * 
	 * @author Max Bogner
	 * @return the anwesenheitsliste
	 */
	public Vector getAnwesenheitsliste() {
		return anwesenheitsliste;
	}

	/**
	 * Setzt die Variable anwesenheitsliste
	 * 
	 * @author Max Bogner
	 * @param anwesenheitsliste
	 *            Die anwesenheitsliste die gesetzt werden soll
	 */
	public void setAnwesenheitsliste(Vector anwesenheitsliste) {
		this.anwesenheitsliste = anwesenheitsliste;
	}

	/**
	 * Fuegt der Liste ein Element hinzu.
	 * 
	 * Gibt einen Boolean als Statusmeldung zurueck.
	 * 
	 * @author Max Bogner
	 * @param anwesenheit
	 *            Eintrag der hinzugefuegt werden soll
	 * @return Status War das hinzufuegen erfolgreich?
	 */

	public boolean addElement(Anwesenheit anwesenheit) {
		try {
			anwesenheitsliste.add(anwesenheit);
			return true;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}

	}

	/**
	 * Loescht das uebergebene Element aus der Liste.
	 * 
	 * Gibt einen Boolean als Statusmeldung zurueck.
	 * 
	 * @author Max Bogner
	 * @param anwesenheit
	 *            Eintrag der aus der Liste entfernt werden soll
	 * @return Status ob der Eintrag erfolgreich geloescht wurde
	 */
	public boolean removeElement(Anwesenheit anwesenheit) {
		try {
			anwesenheitsliste.remove(anwesenheit);
			return true;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * Erstellt aus einer Platzkartenliste eine Liste aus Anwesenheitslisten je
	 * Universitaet und je Pruefungstag
	 * 
	 * @author Max Bogner
	 * @param pklGesamt
	 *            Platzkartenliste aus der die Anwesenheitslisten abgeleitet
	 *            werden
	 * @return Eine Liste mit Anwesenheitslisten. Eine Anwesenheitsliste je
	 *         Universitaet und je Pruefungstag
	 */
	public Vector<AnwesenheitsListe> createAnwesenheitslistenAusPlatzkartenListe(
			PlatzKartenListe pklGesamt) {

		// PlatzKartenListe pro uni
		Vector<PlatzKartenListe> pkll = new Vector<PlatzKartenListe>();
		// PlatzKartenListe pro uni und tag
		Vector<PlatzKartenListe> pkllt = new Vector<PlatzKartenListe>();
		// erstelle Platzkartenlisten pro Universitaet
		pkll = pklGesamt.PlatzkartenlisteNachUni();

		// erstelle Platzkartenlisten pro tag
		// Liste muss sortiert sein
		for (int i = 0; i < pkll.size(); i++) {

			pkllt.addAll(pkll.elementAt(i).createPlatzKartenListenProTag());
		}

		System.out.println("Anzahl an Anwesenheitslisten: " + pkllt.size());
		// legt eine Liste mit Anwesenheitslisten an
		Vector<AnwesenheitsListe> ral = new Vector<AnwesenheitsListe>();

		// Geht die Liste mit Platzkartenlisten durch durch
		for (int il = 0; il < pkllt.size(); il++) {

			PlatzKartenListe cpkl = new PlatzKartenListe();
			// Platzkartenliste auf der weitergearbeitet wird
			cpkl = pkllt.elementAt(il);
			// Anwesenheitsliste die befüllt wird
			AnwesenheitsListe cal = new AnwesenheitsListe();
			// Universitaet als String
			String uni = cpkl.getPlatzkartenliste().elementAt(0).getStudent()
					.getUniversitaet();
			// Pruefungstag als Pruefungstag
			PruefungsTag pt = cpkl.getPlatzkartenliste().elementAt(0)
					.getPruefungstag();

			// Befüllen der Anwesenheitslisten
			// Setzt den Pruefungstagnamen
			cal.pruefungstag = pt.getName();
			// Setzt die Universitat
			cal.universitaet = uni;
			// Geht die einzelnen Eintraege in der Platzkartenliste durch
			for (int i = 0; i < cpkl.getPlatzkartenliste().size(); i++) {
				// Anlegen der fuer die Anwesenheitsliste benoetigten Objekte
				Anwesenheit a = new Anwesenheit();
				KursListe kl = new KursListe();
				Student s = new Student();
				// Setzen von Objekten ueber die Platzkartenliste
				kl = cpkl.getPlatzkartenliste().elementAt(i).getKursliste();
				s = cpkl.getPlatzkartenliste().elementAt(i).getStudent();

				// Befuellen des Anwesenheits-Objektes
				a.setKursListeProTag(kl);
				a.setPruefungsTag(pt);
				a.setStudent(s);
				a.setUniversitaet(uni);
				// fuegt das erstellte Anwesenheits-Objekt der Anwesenheitsliste
				// hinzu
				cal.addElement(a);
			}
			System.out.println("NEUE ANWESENHEITSLISTE ERSTELLT: "
					+ cal.toString());
			// fuegt die befuellte Anwesenheitsliste der Sammelliste fuer
			// Anwesenheitslisten hinzu
			ral.add(cal);
		}

		return ral;

	}

	
	/**
	 * Erstellt den String passend fuer die ausgegebene
	 * Anwesenheitsliste ins Dateisystem
	 * 
	 * @author Max Bogner
	 * @return str (String) gibt die Anwesenheitsliste passend fuer die Ausgabe als String zurueck
	 */

	public String toString() {

		String str = new String();
		// speichert die Universitaet
		String uni = anwesenheitsliste.elementAt(0).getStudent()
				.getUniversitaet();
		// speichert den Pruefungstagnamen
		String pt = anwesenheitsliste.elementAt(0).getPruefungsTag().getName();
		str = str + "Universitaet " + uni + ", " + pt + "\n";
		for (int i = 0; i < anwesenheitsliste.size(); i++) {
			// befuellt das Objekt student mit dem Studenten der
			// Anwesenheitsliste
			Student student = anwesenheitsliste.elementAt(i).getStudent();
			// Erstellt die Strings fuer die Ausgabe
			String stu = student.getName() + ", " + student.getVorname() + ": ";
			String k = anwesenheitsliste.elementAt(i).getKursListeProTag()
					.toStringShort();
			str = str + "\n" + i + ") " + stu + k;
		}
		str=str+ "\n"+ "\n"+ "\n";
		return str;
	}

}
